package com.scsj.cloud.base.log;

import java.util.List;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;


/**
 * 操作日记记录器
 * 
 * <p>
 * 
 * @author caoxiubin
 * @version 2019年06月2日
 * @see
 */
public class OpLogger {

	private static ThreadLocal<List<OpLog>> logThreadLocal = new ThreadLocal<List<OpLog>>();
	
	/**
	 * 0开头表示后台管理功能相关的操作
	 * 1开头表示APP操作相关功能
	 * 8开头表示统一认证相关功能
	 * 999：表示系统异常操作
	 */
	public static String OP_TYPE_LOGINOUT = "000";//登录、退出
	public static String OP_TYPE_CURD = "001";//增加、修改、删除操作
	public static String OP_TYPE_APPROVE = "002";//审批是否通过
	public static String OP_TYPE_APP_LOGINOUT = "100";//APP登录退出
	public static String OP_TYPE_APP_CURD = "101";//通过APP通道访问进行的增加、修改、删除操作
	public static String OP_TYPE_NO_PERMISSION = "998";//无权限的操作
	public static String OP_TYPE_EXCEPTION = "999";//表示操作出现异常
	
	public static String OP_TYPE_UAAS = "800";//统一认证
	
	
	/**
	 * 记录新增、修改、删除操作日志
	 * @param opContent
	 *            操作内容
	 */
	public static void log(Object opContent) {
		
		dbLog(OP_TYPE_CURD,opContent);
	}
	
	/**
	 * 记录新增、修改、删除操作日志
	 * @param opDesc 操作描述
	 * @param opContent
	 *            操作内容
	 */
	public static void log(String opDesc,Object opContent) {
		
		dbLog(OP_TYPE_CURD,opDesc,opContent);
	}
	
	/**
	 * 记录指定类型的操作日志
	 * @param opType 操作类型
	 * @param opDesc 操作描述
	 * @param opContent
	 *            操作内容
	 */
	public static void log(String opType,String opDesc,Object opContent) {
		
		dbLog(opType,opDesc,opContent);
	}
	
	

	
	
	/**
	 * 记录手机新增、修改、删除操作日志
	 * @param opContent
	 *            操作内容
	 */
	public static void appLog(Object opContent) {
		
		dbLog(OP_TYPE_APP_CURD,opContent);
	}
	
	/**
	 * 记录手机新增、修改、删除操作日志
	 * @param opDesc 操作描述
	 * @param opContent
	 *            操作内容
	 */
	public static void appLog(String opDesc,Object opContent) {
		
		dbLog(OP_TYPE_APP_CURD,opDesc,opContent);
	}


	/**
	 * 记录操作日志
	 * @param opType 操作类型
	 * @param opContent
	 *            操作内容
	 */
	private static OpLog dbLog(String opType,Object opContent) {
	
		return dbLog(opType,null,opContent);
	}
	
	/**
	 * 记录操作日志
	 * @param opType 操作类型
	 * @param opDesc 操作描述
	 * @param opContent
	 *            操作内容
	 */
	public static OpLog dbLog(String opType,String opDesc,Object opContent) {
		
		OpLog opLog = new OpLog();
		opLog.setOpType(opType);
		opLog.setOpDesc(opDesc);
		
		String opContentStr = "";
		
		if(opContent == null){
			
		}else if(opContent instanceof String){
			opContentStr = opContent.toString();
		}else{
			opContentStr = JSON.toJSONString(opContent);
		}
		opLog.setContent(opContentStr);
		OpLogger.bind(opLog);
		
		return opLog;
	}
	
	/**
	 * 记录操作日志
	 * @param opType 操作类型
	 * @param opUser 操作用户
	 * @param clientIP 客户端IP地址
	 * @param opDesc 操作描述
	 * @param opContent
	 *            操作内容
	 */
	public static OpLog dbLog(String opType,String opUser,String clientIP,String opDesc,Object opContent) {
		
		OpLog opLog = new OpLog();
		opLog.setOpType(opType);
		opLog.setOpDesc(opDesc);
		opLog.setOpUser(opUser);
		opLog.setClientIP(clientIP);
		
		String opContentStr = "";
		
		if(opContent == null){
			
		}else if(opContent instanceof String){
			opContentStr = opContent.toString();
		}else{
			opContentStr = JSON.toJSONString(opContent);
		}
		opLog.setContent(opContentStr);
		OpLogger.bind(opLog);
		
		return opLog;
	}	
	
	
	/**
	 * 记录操作日志
	 * @param opType 操作类型
	 * @param opDesc 操作描述
	 * @param opContent
	 *            操作内容
	 */
	public static OpLog appLog(String opType,String opDesc,Object opContent,long deviceId) {
		
		OpLog opLog = OpLogger.dbLog(opType, opDesc,opContent);
		opLog.setDeviceId(deviceId);
		
		return opLog;
	}
	
	
	/**
	 * 绑定操作内容到当前线程
     * @param opType 操作类型
	 * @param opContent 操作内容
	 */
	public static void bind(OpLog opLog){
		
		List<OpLog> opLogList = OpLogger.logThreadLocal.get();
		
		if(opLogList == null){
			opLogList = Lists.newArrayList();
			OpLogger.logThreadLocal.set(opLogList);
		}
		
		opLogList.add(opLog);
	}
	
	
	/**
	 * 获取操作日志列表
	 * @return
	 */
	public static List<OpLog> getOpLogList(){
		return logThreadLocal.get();
	}
	
	public static void clear(){
		
		List<OpLog> opLogList = logThreadLocal.get();
		
		if(opLogList != null)
			opLogList.clear();
	}



}
